/*
 * lcd.h
 *
 *  Created on: 2021年11月11日
 *      Author: CameronLee
 */

#ifndef LCD_LCD_H_
#define LCD_LCD_H_

#include "main.h"
#include "fonts.h"



/********信号线控制相关的宏***************/
#define	ILI9341_CS_SET  	ILI9341_CS_GPIO_Port->BSRR=ILI9341_CS_Pin    //片选端口
#define	ILI9341_DC_SET		ILI9341_DC_GPIO_Port->BSRR=ILI9341_DC_Pin    //数据/命令
#define	ILI9341_WR_SET		ILI9341_WR_GPIO_Port->BSRR=ILI9341_WR_Pin    //写数据
#define	ILI9341_RD_SET		ILI9341_RD_GPIO_Port->BSRR=ILI9341_RD_Pin    //读数据

#define	ILI9341_CS_CLR  	ILI9341_CS_GPIO_Port->BRR=ILI9341_CS_Pin     //片选端口
#define	ILI9341_DC_CLR		ILI9341_DC_GPIO_Port->BRR=ILI9341_DC_Pin     //数据/命令
#define	ILI9341_WR_CLR		ILI9341_WR_GPIO_Port->BRR=ILI9341_WR_Pin     //写数据
#define	ILI9341_RD_CLR		ILI9341_RD_GPIO_Port->BRR=ILI9341_RD_Pin     //读数据


//数据线输入输出
#define ILI9341_DATA_PORT  GPIOB
#define DATAOUT(x) 	ILI9341_DATA_PORT->ODR=x; //数据输出
#define DATAIN     	ILI9341_DATA_PORT->IDR;   //数据输入


#define      DEBUG_DELAY()         HAL_Delay(1000);

/***************************** ILI934 显示区域的起始坐标和总行列数 ***************************/
#define      ILI9341_DispWindow_X_Star		    0     //起始点的X坐标
#define      ILI9341_DispWindow_Y_Star		    0     //起始点的Y坐标

#define 	ILI9341_LESS_PIXEL	  				240			//液晶屏较短方向的像素宽度
#define 	ILI9341_MORE_PIXEL	 				320			//液晶屏较长方向的像素宽度


//根据液晶扫描方向而变化的XY像素宽度
//调用ILI9341_GramScan函数设置方向时会自动更改
extern uint16_t LCD_X_LENGTH,LCD_Y_LENGTH;

//液晶屏扫描模式
//参数可选值为0-7
extern uint8_t LCD_SCAN_MODE;


/******************************* 定义 ILI934 显示屏常用颜色 ********************************/
#define      BACKGROUND		                BLACK   //默认背景颜色

#define      WHITE		 		                  0xFFFF	   //白色
#define      BLACK                         0x0000	   //黑色
#define      GREY                          0xF7DE	   //灰色
#define      BLUE                          0x001F	   //蓝色
#define      BLUE2                         0x051F	   //浅蓝色
#define      RED                           0xF800	   //红色
#define      MAGENTA                       0xF81F	   //红紫色，洋红色
#define      GREEN                         0x07E0	   //绿色
#define      CYAN                          0x7FFF	   //蓝绿色，青色
#define      YELLOW                        0xFFE0	   //黄色
#define      BRED                          0xF81F
#define      GRED                          0xFFE0
#define      GBLUE                         0x07FF

/******************************* 定义 ILI934 常用命令 ********************************/
#define      CMD_SetCoordinateX		 		    0x2A	     //设置X坐标
#define      CMD_SetCoordinateY		 		    0x2B	     //设置Y坐标
#define      CMD_SetPixel		 		          0x2C	     //填充像素










void LCD_ClearLine(uint16_t Line);
void LCD_SetBackColor(uint16_t Color);
void LCD_SetTextColor(uint16_t Color);
void LCD_GetColors(uint16_t *TextColor, uint16_t *BackColor);
void LCD_SetColors(uint16_t TextColor, uint16_t BackColor);

void 		LCD_SetFont			(sFONT *fonts);
sFONT 		*LCD_GetFont			(void);


void ILI9341_Init( void );
void ILI9341_BackLed_Control ( FunctionalState enumState );
void ILI9341_GramScan ( uint8_t ucOption );

void ILI9341_Clear ( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight );
void ILI9341_OpenWindow ( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight );



void ILI9341_DrawLine ( uint16_t usX1, uint16_t usY1, uint16_t usX2, uint16_t usY2 );
void ILI9341_DrawRectangle ( uint16_t usX_Start, uint16_t usY_Start, uint16_t usWidth, uint16_t usHeight, uint8_t ucFilled );
void ILI9341_DrawCircle ( uint16_t usX_Center, uint16_t usY_Center, uint16_t usRadius, uint8_t ucFilled );

void ILI9341_DispChar_EN ( uint16_t usX, uint16_t usY, const char cChar );
void ILI9341_DispStringLine_EN (  uint16_t line,  char * pStr );
void ILI9341_DispString_EN ( 	uint16_t usX ,uint16_t usY,  char * pStr );
void ILI9341_DispString_EN_YDir (	 uint16_t usX,uint16_t usY ,  char * pStr );
void ILI9341_DispChar_CH ( uint16_t usX, uint16_t usY, uint16_t usChar );
void ILI9341_DispString_CH ( 	uint16_t usX , uint16_t usY, char * pStr );
void ILI9341_DispStringLine_EN_CH (  uint16_t line, char * pStr );
void ILI9341_DispString_EN_CH ( 	uint16_t usX , uint16_t usY, char * pStr );
void ILI9341_DispString_EN_CH_YDir (  uint16_t usX,uint16_t usY , char * pStr );




void ILI9341_DisplayStringEx(uint16_t x, 		//字符显示位置x
							 uint16_t y, 				//字符显示位置y
							 uint16_t Font_width,	//要显示的字体宽度，英文字符在此基础上/2。注意为偶数
							 uint16_t Font_Height,	//要显示的字体高度，注意为偶数
							 uint8_t *ptr,					//显示的字符内容
							 uint16_t DrawModel);  //是否反色显示

void ILI9341_DisplayStringEx_YDir(uint16_t x, 		//字符显示位置x
								 uint16_t y, 				//字符显示位置y
								 uint16_t Font_width,	//要显示的字体宽度，英文字符在此基础上/2。注意为偶数
								 uint16_t Font_Height,	//要显示的字体高度，注意为偶数
								 uint8_t *ptr,					//显示的字符内容
								 uint16_t DrawModel);  //是否反色显示






#endif /* LCD_LCD_H_ */
